#include "wxsitemfactory.h"
#include "wxsitem.h"
#include "../wxsresourcetree.h"

wxsItem* wxsItemFactory::Build( const wxString& Name, wxsItemResData* Data ) {
  ItemMapT::iterator it = ItemMap().find( Name );
  if( it == ItemMap().end() ) {
    return 0;
  }
  wxsItem* Item = it->second->OnBuild( Data );
  switch( Item->GetInfo().Type ) {
    case wxsTTool:
      if( !Item->ConvertToTool() ) {
        delete Item;
        return 0;
      }
      break;
    case wxsTContainer:
      if( !Item->ConvertToParent() ) {
        delete Item;
        return 0;
      }
      break;
    case wxsTSizer:
    case wxsTSpacer:
    case wxsTWidget:
      break;
    case wxsTInvalid:
    default:
      delete Item;
      return 0;
  }
  return Item;
}

const wxsItemInfo* wxsItemFactory::GetInfo( const wxString& Name ) {
  ItemMapT::iterator it = ItemMap().find( Name );
  if( it == ItemMap().end() ) {
    return 0;
  }
  return it->second->m_Info;
}

const wxsItemInfo* wxsItemFactory::GetFirstInfo() {
  m_Iter = ItemMap().begin();
  return ( m_Iter == ItemMap().end() ) ? 0 : m_Iter->second->m_Info;
}

const wxsItemInfo* wxsItemFactory::GetNextInfo() {
  if( m_Iter == ItemMap().end() ) {
    return 0;
  }
  ++m_Iter;
  return ( m_Iter == ItemMap().end() ) ? 0 : m_Iter->second->m_Info;
}

wxImageList& wxsItemFactory::GetImageList() {
  return wxsResourceTree::GetGlobalImageList();
}

int wxsItemFactory::LoadImage( const wxString& FileName ) {
  return wxsResourceTree::LoadImage( FileName );
}

wxsItemFactory::wxsItemFactory( const wxsItemInfo* Info ):
  m_Info( Info ) {
  m_Name = Info->ClassName;
  if( Info == 0 ) {
    return;
  }
  ItemMap()[m_Name] = this;
}

wxsItemFactory::wxsItemFactory( const wxsItemInfo* Info, wxString ClassName ):
  m_Info( Info ) {
  m_Name = ClassName;
  if( Info == 0 ) {
    return;
  }
  ItemMap()[m_Name] = this;
}

wxsItemFactory::~wxsItemFactory() {
  if( !m_Info ) {
    return;
  }
  ItemMapT::iterator it = ItemMap().find( m_Name );
  if( it == ItemMap().end() ) {
    return;
  }
  if( it->second != this ) {
    return;
  }
  ItemMap().erase( it );
}

wxsItemFactory::ItemMapT& wxsItemFactory::ItemMap() {
  static ItemMapT Map;
  return Map;
}

wxsItemFactory::ItemMapT::iterator wxsItemFactory::m_Iter( wxsItemFactory::ItemMap().end() );
